// 类型声明

//  重点：*******
// declare只是声明，不需要实现，它只是给编译器看的


// 声明文件可以让我们不需要将JS重构为TS，只需要加上声明文件就可以使用系统
// 类型声明在编译的时候都会被删除，不会影响真正的代码
// 关键字 declare 表示声明的意思,我们可以用它来做出各种声明
// declare var  声明全局变量
// declare function  声明全局方法
// declare class  声明全局类
// declare enum 声明全局枚举类型
// declare namespace 声明(含有子属性的)全局对象
// interface 和 type 声明全局类型

// 1.普通类型声明
namespace a {
    declare let name:string;
    declare function getname() :string;
    declare class Animal {name:string };
    // getname()
    // new Animal().name
}

// 2.外部枚举
// 外部枚举是使用declare enum定义的枚举类型
// 外部枚举用来描述已经存在的枚举类型的形状 
namespace b {
    declare enum Seasons {Spring,}
    let seasons = [Seasons.Spring]
    // declare 定义的类型只会用于编译时的检查，编译结果中会被删除。
}

// 3.namespace
// 如果一个全局变量包括了很多子属性，可能使用namespace
// 在声明文件中的namespace表示一个全局变量包含很多子属性
// 在命名空间内部不需要使用 declare 声明属性或方法
declare namespace ${
    function ajax(url:string,settings:any):void;
    let name:string;
    namespace fn {
        function extend(object:any):void;
    }
}
$.ajax('/api/users',{});
$.fn.extend({
    log:function(message:any){
        console.log(message);
    }
});
export {};

// 4.类型声明文件
// 我们可以把类型声明放在一个单独的类型声明文件中
// 可以在类型声明文件中使用类型声明
// 文件命名规范为*.d.ts
// 观看类型声明文件有助于了解库的使用方式

// 5.第三方声明文件
// 可以安装使用第三方的声明文件
// @types是一个约定的前缀，所有的第三方声明的类型库都会带有这样的前缀
// JavaScript 中有很多内置对象，它们可以在 TypeScript 中被当做声明好了的类型
// 内置对象是指根据标准在全局作用域（Global）上存在的对象。这里的标准是指 ECMAScript 和其他环境（比如 DOM）的标准
// 这些内置对象的类型声明文件，就包含在TypeScript 核心库的类型声明文件中
// cnpm i jquery -S
// cnpm i @types/jquery -S //安装jquery类型声明库
// import * as jQuery from 'jquery'; //就可以全局使用jquery
// jQuery.ajax('/user/1');

// 6.自己编写声明文件


